<?php

namespace App\Http\Middleware;

use App\Model\Admin;
use Closure;
use Illuminate\Support\Facades\Route;

class HasRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(session()->get('LoginAdmin')) {
            // 获取当前路由地址  对应的 控制器方法名
            $route = Route::current()->getActionName();

            // 获取权限
            $route_role = substr($route, 0, strripos($route, '@') + 1);

            // 获取当前管理员权限
            $LoginAdmin = !empty(session()->get('LoginAdmin')) ? session()->get('LoginAdmin') : '';

            $adminList = Admin::all();

            $adminid = 0;

            foreach ($adminList as $item) {
                $val = md5($item['id'] . $item['salt']);

                if ($LoginAdmin == $val) {
                    $adminid = $item['id'];
                    break;
                }
            }

            $admin = Admin::find($adminid);

            // 获取当前管理员角色
            $role = $admin->role;
            // 根据管理员对应的角色，找对应的权限
            // 存储对应的路由权限per_url
            $arr = [];

            foreach ($role as $v) {
                $perms = $v->permission;
                foreach ($perms as $k) {
                    $arr[] = $k->per_url;
                }
            }

            // 去除掉重复权限
            $arr = array_unique($arr);
            // 判断当前管理员权限路由，是否在当前路由权限中，有权限就放行
            if (in_array($route_role, $arr)) {
                return $next($request);
            } else {
                return redirect('noaccess');
            }
        }else{
            return redirect('admin/login')->withErrors('您还未登录，请先登录！','admin') ->withInput();
        }
    }
}
